home *** CD-ROM | disk | FTP | other *** search
Text File | 1990-06-14 | 2.7 KB | 105 lines | [OBJ /MPS ] |
- header := AddGrowCard(stack);
- IF header = NIL THEN RETURN 0; END;
- ELSE
- header := VAL( ADDRESS, VAL(LONGCARD,filledCards) * VAL(LONGCARD,cardSize) )
- + VAL(ADDRESS, dataPtr);
- INC(filledCards);
- END;
- END;
-
- CopyStr(31,name,header^.cName);
- INC(stack^^.totalFilled);
- FillHeader(stack,header);
-
- dest := VAL(ADDRESS,header) + SIZE(CardHeader); (* data goes just after header. *)
- BlockMove(data,dest,VAL(LONGINT,stack^^.cardSize-VAL(CARDINAL,SIZE(CardHeader))));
-
- RETURN header^.id;
- END AddCard;
-
- PROCEDURE FindKeyIndex(keysArrPtr:DataKeysPtr; indx,totFil:CARDINAL):CARDINAL;
- EXTERNAL;
-
- (*
- PROCEDURE FindKeyIndex(keysArrPtr:DataKeysPtr; indx,totFil:CARDINAL):CARDINAL;
- VAR i :CARDINAL;
- BEGIN
- i := 1;
- REPEAT
- IF keysArrPtr^[i] = indx THEN RETURN i; END;
- INC(i);
- UNTIL i > totFil;
- RETURN 0;
- END FindKeyIndex;
- *)
-
- PROCEDURE UpdateCardKeys(keysArrPtr:DataKeysPtr; indx,totFil:CARDINAL);
- VAR
- targKeyIndx,lastKeyIndx :CARDINAL;
- dst :ADDRESS;
- BEGIN
- (* find index of key pointing to target card. *)
- targKeyIndx := FindKeyIndex(keysArrPtr,indx,totFil);
-
- (* find index of key pointing to last card. *)
- lastKeyIndx := FindKeyIndex(keysArrPtr,totFil,totFil);
-
- (* replace key to lastCard with indx (new location for lastCard). *)
- keysArrPtr^[lastKeyIndx] := indx;
-
- (* move keys up and over indx of key pointing to target. *)
- (* dst := VAL(LONGINT,targKeyIndx)*2 + VAL(ADDRESS,keysArrPtr); *)
- dst := ADR(keysArrPtr^[targKeyIndx]);
- BlockMove(dst+SIZE(CARDINAL),dst,VAL(LONGINT,totFil-targKeyIndx)*SIZE(CARDINAL));
- END UpdateCardKeys;
-
- PROCEDURE RemoveLastGrowBlock(stack:DataStack);
- VAR growHnd,preGrowHnd :GrowStack;
- BEGIN
- preGrowHnd := NIL;
- growHnd := stack^^.growStk; (* we know growStk is not NIL. *)
- WHILE growHnd^^.growStk # NIL DO
- preGrowHnd := growHnd;
- growHnd := growHnd^^.growStk;
- END;
- IF preGrowHnd = NIL THEN (* remove first growStk. *)
- DisposPtr(stack^^.growStk^^.dataPtr);
- DisposHandle(stack^^.growStk);
- stack^^.growStk := NIL;
- ELSE
- DisposPtr(growHnd^^.dataPtr);
- DisposHandle(preGrowHnd^^.growStk);
- preGrowHnd^^.growStk := NIL;
- END;
- END RemoveLastGrowBlock;
-
- PROCEDURE RemoveLastCard(stack:DataStack);
- VAR growHnd :GrowStack;
- BEGIN
- growHnd := stack^^.growStk;
- IF growHnd = NIL THEN
- DEC(stack^^.filledCards);
- ELSE
- WHILE growHnd^^.growStk # NIL DO
- growHnd := growHnd^^.growStk;
- END;
-
- IF growHnd^^.filledCards = 1 THEN
- RemoveLastGrowBlock(stack);
- ELSE
- DEC(growHnd^^.filledCards);
- END;
- END;
- DEC(stack^^.totalFilled);
- END RemoveLastCard;
-
- PROCEDURE RemoveCard(stack:DataStack; indx:CARDINAL; id:LONGCARD);
- VAR
- targ,last :HeadPtr;
- totFil :CARDINAL;
- BEGIN
- IF indx > totFil THEN
- dataStackErr := indxOutOfRange;
- RETURN;
- ELSE
- dataStackE